package com.yc.spring.aop;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

// CBLib 动态字节码技术 => 基于继承实现
// final 修饰的类和方法 无法CGLIB代理
// JDK 动态代理, 被代理对象与代理对象的关系?   兄弟关系
// CGLIB 动态代理, 被代理对象与代理对象的关系?  父子关系
public class CBLibProxy {

    public static void main(String[] args) {
        Person p = new 被告();
        final Person proxy = proxy(p);
        proxy.say();
    }

    public static <T> T proxy( T t){

        Enhancer enhancer = new Enhancer();
        // 设置父类
        enhancer.setSuperclass(t.getClass());
        // 设置回调对象 => 方法拦截对象
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects,
                                    MethodProxy methodProxy) throws Throwable {
                System.out.println("被告不在场!");
                final Object ret = methodProxy.invoke(t, objects);
                System.out.println("被告是精神病!");
                return ret;
            }
        });

        return (T) enhancer.create();

    }

}


class A {
    // ...
}

class B extends A {
    // 重写被代理的方法
}
